/**
 * @Author:Geln Yang
 * @Created:2008-10-21
 * $ Revision: 1.0 $
 * $ Author: Geln Yang $
 * $ Date: 2008-10-21 $
 */
package org.geln.algorithem;

/**
 * @Author:Geln Yang
 * @Created:2008-10-21 <br>
 * 对于从1到N的连续整集合合，能划分成两个子集合，且保证每个集合的数字和是相等的。<br>
 * 举个例子，如果N=3，对于{1，2，3}能划分成两个子集合，他们每个的所有数字和是相等的：<br>
 * and {1,2}<br>
 * 这是唯一一种分发（交换集合位置被认为是同一种划分方案，因此不会增加划分方案总数）<br>
 * 如果N=7，有四种方法能划分集合{1，2，3，4，5，6，7}，每一种分发的子集合各数字和是相等的:<br>
 * {1,6,7} and {2,3,4,5} {注 1+6+7=2+3+4+5}<br>
 * {2,5,7} and {1,3,4,6}<br>
 * {3,4,7} and {1,2,5,6}<br>
 * {1,2,4,7} and {3,5,6}<br>
 * 给出N，你的程序应该输出划分方案总数，如果不存在这样的划分方案，则输出0。程序不能预存结果直接输出。<br>
 * PROGRAM NAME: subset<br>
 * INPUT FORMAT<br>
 * 输入文件只有一行，且只有一个整数N<br>
 * SAMPLE INPUT (file subset.in)<br>
 * 7<br>
 * OUTPUT FORMAT<br>
 * 输出划分方案总数，如果不存在则输出0。<br>
 * SAMPLE OUTPUT (file subset.out)<br>
 * 4<br>
 */
public class Subset {

	public static void main(String[] args) {
		int n = 7;
		int s = n * (n + 1);
		int dyn[] = new int[s];
		if (s % 4 != 0) {
			return;
		}
		s /= 4;
		int i, j;
		dyn[0] = 1;
		for (i = 1; i <= n; i++)
			for (j = s; j >= i; j--)
				dyn[j] += dyn[j - i];
		System.out.println(dyn[s] / 2);

	}

}
